package cn.iocoder.boot.springai001.tools;

import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.json.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.tool.annotation.Tool;
import org.springframework.ai.tool.annotation.ToolParam;

@Slf4j
public class CoalTools {

    String coalFieldDescription = """
            配煤优化参数说明：
            demand=需求量(吨)
            cost_min=成本最小值(元/吨)
            cost_max=成本最大值(元/吨)
            
            配煤质量指标:
            blendcoal_ad_min=配合煤灰分最小值(%)
            blendcoal_ad_max=配合煤灰分最大值(%)
            blendcoal_v_min=配合煤挥发分最小值(%)
            blendcoal_v_max=配合煤挥发分最大值(%)
            blendcoal_s_min=配合煤硫分最小值(%)
            blendcoal_s_max=配合煤硫分最大值(%)
            blendcoal_g_min=配合煤粘结指数最小值
            blendcoal_g_max=配合煤粘结指数最大值
            blendcoal_y_min=配合煤胶质层厚度最小值(mm)
            blendcoal_y_max=配合煤胶质层厚度最大值(mm)
            
            焦炭质量指标:
            coke_ad_min=焦炭灰分最小值(%)
            coke_ad_max=焦炭灰分最大值(%)
            coke_s_min=焦炭硫分最小值(%)
            coke_s_max=焦炭硫分最大值(%)
            coke_m40_min=焦炭M40最小值(%)
            coke_m40_max=焦炭M40最大值(%)
            coke_m10_min=焦炭M10最小值(%)
            coke_m10_max=焦炭M10最大值(%)
            coke_csr_min=焦炭反应后强度CSR最小值(%)
            coke_csr_max=焦炭反应后强度CSR最大值(%)
            coke_cri_min=焦炭反应性CRI最小值(%)
            coke_cri_max=焦炭反应性CRI最大值(%)
            """;

    private static final String COAL_API_URL = "http://124.222.221.85:8102/opt/coalOptimization";

    /**
     * 获取默认配煤优化模板
     */
    private JSONObject getDefaultTemplate() {
        JSONObject template = new JSONObject();
        
        // 基础参数
        template.set("j_55", 25);
        template.set("j_60", 25);
        template.set("j_65", 30);
        template.set("j_70", 55);
        template.set("coals", null);
        
        // 规则
        JSONObject rule = new JSONObject();
        rule.set("max", 0.6);
        rule.set("min", 0);
        rule.set("type", "sum");
        rule.set("remark", "");
        rule.set("isDelete", 0);
        rule.set("property", "PS,PM,WY,1/2ZN,RN,CY,QM");
        
        JSONObject createTime = new JSONObject();
        createTime.set("day", 6);
        createTime.set("date", 11);
        createTime.set("time", 1760150285000L);
        createTime.set("year", 125);
        createTime.set("hours", 10);
        createTime.set("month", 9);
        createTime.set("minutes", 38);
        createTime.set("seconds", 5);
        createTime.set("timezoneOffset", -480);
        
        rule.set("createTime", createTime);
        rule.set("updateTime", null);
        rule.set("structureDetailId", 211);
        rule.set("coalBlendingStructureId", 174);
        
        template.set("rules", new Object[]{rule});
        
        // 需求和用户信息
        template.set("demand", 100);
        template.set("shifts", "1");
        template.set("userId", 289);
        template.set("optType", 0);
        template.set("companyId", 164);
        
        // 成本范围
        template.set("cost_max", 1500);
        template.set("cost_min", 0);
        
        // 焦炭质量指标
        template.set("coke_s_max", 0.75);
        template.set("coke_s_min", 0.6);
        template.set("coke_ad_max", 13);
        template.set("coke_ad_min", 12);
        template.set("coke_cri_max", 30);
        template.set("coke_cri_min", 20);
        template.set("coke_csr_max", 70);
        template.set("coke_csr_min", 60);
        template.set("coke_m10_max", 7);
        template.set("coke_m10_min", 5.5);
        template.set("coke_m40_max", 95);
        template.set("coke_m40_min", 84);
        
        // 配合煤质量指标
        template.set("blendcoal_g_max", 70);
        template.set("blendcoal_g_min", 60);
        template.set("blendcoal_s_max", 0.9);
        template.set("blendcoal_s_min", 0.6);
        template.set("blendcoal_v_max", 30);
        template.set("blendcoal_v_min", 26);
        template.set("blendcoal_x_max", 60);
        template.set("blendcoal_x_min", 30);
        template.set("blendcoal_y_max", 20);
        template.set("blendcoal_y_min", 10);
        template.set("blendcoal_ad_max", 10);
        template.set("blendcoal_ad_min", 9);
        
        // 其他配置
        template.set("cal_pattern", "1");
        template.set("furnaceType", 7);
        template.set("hole_produce", "");
        template.set("resourceType", "inventoryResLibrary");
        template.set("daily_consume", "");
        template.set("daily_produce", "");
        template.set("plan_strategy", "1");
        template.set("use_coal_quality", 1);
        template.set("isComprehensiveLib", 0);
        
        return template;
    }

    /**
     * 配煤优化计算工具
     * <a href="http://124.222.221.85:8102/opt/coalOptimization">API文档</a>
     *
     * @param minCsr 焦炭反应后强度CSR最小值，默认60
     * @param maxCri 焦炭反应性CRI最大值，默认30
     * @param demand 配煤需求量（吨），默认100
     * @param minCost 成本最小值（元/吨），默认0
     * @param maxCost 成本最大值（元/吨），默认1500
     * @return 配煤优化结果（JSON格式）
     */
    @Tool(description = "调用配煤优化接口进行配煤优化计算，可以设置焦炭质量指标（CSR、CRI）、需求量、成本范围等参数")
    public String optimizeCoalBlending(
            @ToolParam(description = "焦炭反应后强度CSR最小值(%)，默认：60") Double minCsr,
            @ToolParam(description = "焦炭反应性CRI最大值(%)，默认：30") Double maxCri,
            @ToolParam(description = "配煤需求量(吨)，默认：100") Integer demand,
            @ToolParam(description = "成本最小值(元/吨)，默认：0") Integer minCost,
            @ToolParam(description = "成本最大值(元/吨)，默认：1500") Integer maxCost
    ) {
        JSONObject payload = getDefaultTemplate();
        
        // 覆盖传入的参数
        if (minCsr != null) {
            payload.set("coke_csr_min", minCsr);
        }
        if (maxCri != null) {
            payload.set("coke_cri_max", maxCri);
        }
        if (demand != null) {
            payload.set("demand", demand);
        }
        if (minCost != null) {
            payload.set("cost_min", minCost);
        }
        if (maxCost != null) {
            payload.set("cost_max", maxCost);
        }
        
        return coalFieldDescription + "\n\n" + post(payload);
    }

    /**
     * 高级配煤优化计算工具 - 支持更多参数配置
     *
     * @param minCsr 焦炭反应后强度CSR最小值
     * @param maxCri 焦炭反应性CRI最大值
     * @param minM40 焦炭M40最小值
     * @param minM10 焦炭M10最小值
     * @param maxM10 焦炭M10最大值
     * @param maxM40 焦炭M40最大值
     * @param minBlendcoalV 配合煤挥发分最小值
     * @param maxBlendcoalV 配合煤挥发分最大值
     * @param minBlendcoalS 配合煤硫分最小值
     * @param maxBlendcoalS 配合煤硫分最大值
     * @param demand 配煤需求量
     * @return 配煤优化结果（JSON格式）
     */
    @Tool(description = "高级配煤优化计算，支持更详细的焦炭和配合煤质量指标设置")
    public String advancedCoalOptimization(
            @ToolParam(description = "焦炭CSR最小值(%)") Double minCsr,
            @ToolParam(description = "焦炭CRI最大值(%)") Double maxCri,
            @ToolParam(description = "焦炭M40最小值(%)") Double minM40,
            @ToolParam(description = "焦炭M10最小值(%)") Double minM10,
            @ToolParam(description = "焦炭M10最大值(%)") Double maxM10,
            @ToolParam(description = "焦炭M40最大值(%)") Double maxM40,
            @ToolParam(description = "配合煤挥发分最小值(%)") Double minBlendcoalV,
            @ToolParam(description = "配合煤挥发分最大值(%)") Double maxBlendcoalV,
            @ToolParam(description = "配合煤硫分最小值(%)") Double minBlendcoalS,
            @ToolParam(description = "配合煤硫分最大值(%)") Double maxBlendcoalS,
            @ToolParam(description = "配煤需求量(吨)") Integer demand
    ) {
        JSONObject payload = getDefaultTemplate();
        
        // 焦炭质量指标
        if (minCsr != null) {
            payload.set("coke_csr_min", minCsr);
        }
        if (maxCri != null) {
            payload.set("coke_cri_max", maxCri);
        }
        if (minM40 != null) {
            payload.set("coke_m40_min", minM40);
        }
        if (minM10 != null) {
            payload.set("coke_m10_min", minM10);
        }
        if (maxM10 != null) {
            payload.set("coke_m10_max", maxM10);
        }
        if (maxM40 != null) {
            payload.set("coke_m40_max", maxM40);
        }
        // 配合煤质量指标
        if (minBlendcoalV != null) {
            payload.set("blendcoal_v_min", minBlendcoalV);
        }
        if (maxBlendcoalV != null) {
            payload.set("blendcoal_v_max", maxBlendcoalV);
        }
        if (minBlendcoalS != null) {
            payload.set("blendcoal_s_min", minBlendcoalS);
        }
        if (maxBlendcoalS != null) {
            payload.set("blendcoal_s_max", maxBlendcoalS);
        }
        
        // 需求量
        if (demand != null) {
            payload.set("demand", demand);
        }
        
        return coalFieldDescription + "\n\n" + post(payload);
    }

    /**
     * 发送配煤优化请求
     */
    private String post(JSONObject payload) {
        HttpRequest request = HttpRequest.post(COAL_API_URL)
                .header("Content-Type", "application/json")
                .body(payload.toString())
                .timeout(60000); // 60秒超时

        try (HttpResponse response = request.execute()) {
            if (response.isOk()) {
                log.info("【配煤优化计算】请求成功");
                return response.body();
            } else {
                return String.format("{\"error\": \"请求失败\", \"statusCode\": %d, \"message\": \"%s\"}",
                        response.getStatus(), response.body());
            }
        } catch (Exception e) {
            log.error("【配煤优化计算】请求异常", e);
            return String.format("{\"error\": \"请求异常\", \"message\": \"%s\"}", e.getMessage());
        }
    }

}

